/*****************************************************************************
 *                     Projet de HCR : Annuaire distribué                    *
 *                      Guillaume MONTAVON (Master 2 RIM)                    *
 *                                                                           *
 * Thread qui s'occupe de communiquer avec un client : il répond aux demandes*
 *               de celui-ci en utilisant un protocole spécifique            *
 *****************************************************************************/

import java.io.*;
import java.net.Socket;

public class ClientThread extends Thread {

	private Socket socket;
	private Serveur serveur;
	private int numClient;
	private String adresseClient;
	
	public ClientThread(Socket socket, int numClient, Serveur serveur) {
		
		this.socket = socket;
		this.serveur = serveur;
		this.numClient = numClient;
		adresseClient = socket.getInetAddress().getHostAddress();
		System.out.println("\nCréation du client numero " + numClient + " (" + adresseClient + ")");		
		
	}
	
	@Override
	public void run() {
		
		if(socket != null) {
			
		BufferedReader in = null;
		PrintWriter out = null;
			
			try {
				// Création des streams pour envoyer et recevoir les infos
				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
				
				String line = "";
				
				
				while(line != null && !line.startsWith("fin")) {
					
					System.out.println("\nEn écoute d'une nouvelle demande du client (" + adresseClient + ")..........\n");
					
					line = in.readLine();
					
					System.out.println("Client "+ numClient + "(" + adresseClient + ") envoie " + line);
					
					if(line != null && line.startsWith("demande")) {
						line = in.readLine();
						System.out.println("Client "+ numClient + "(" + adresseClient + ") : " + line);
						System.out.println("Envoie de "+ serveur.getAnnuaire().getIpByName(line) + " au client");
						
						//attente de 10s pour simuler le fait que le serveur possède une très grande base de données
						try{
							Thread.sleep(10000);//sleep for 1000 ms
						} catch(InterruptedException ie){
							System.out.println(ie);
						}
						
						out.print(serveur.getAnnuaire().getIpByName(line));  
						out.flush();
					}
					else if(line != null &&line.startsWith("enregistrement")) {
						line = in.readLine();
						System.out.println("Client "+ numClient + "(" + adresseClient + ") : " + line);
						while(!line.startsWith("termine")) {
							System.out.println("Client " + numClient + " recoie : " + line);
							serveur.ajouterNom(line, adresseClient);
							line = in.readLine();
						}
					}
					else if(line != null &&line.startsWith("suppression")) {
						line = in.readLine();
						System.out.println("Client "+ numClient + "(" + adresseClient + ") : " + line);
						serveur.supprimerNom(line);
						out.print("suppression");
						out.flush();
					}
					
				}
				
			} catch(IOException e) {
				System.err.println(e);
			}
			finally {
				try {
					serveur.supprimerClient(this);
					System.out.println("suppression client");
					// Close the streams 
					out.close(); 
					in.close(); 
					// Close the socket before quitting 
					socket.close(); 
				} catch(Exception e) { 
					e.printStackTrace(); 
				}
			}
			
		}
		
	}
	
	public String getAdresse() {
		return adresseClient;
	}
	
}
